默默的也到了鐵人賽的最後一天,感謝看到這裡的你各位,這邊我們來進行一些回顧,檢視一下哪一些目標尚未達成
與第一天預期的進度,差了 sleep()
和 wakeup()
,這個部分目前的計畫是要放在講解完 Swtich Thread 之後放進來,在 Switch Thread 中可以看到使用 lock 的一些想法,而在 sleep()
與 wakeup()
,我們會舉出一些使用 lock 的問題,並漸漸地引入 sleep()
和 wakeup()
。
綜觀整個 xv6,或是說 6S081 這一課程,我們還沒有對 File System,以及作業系統的持久化數據進行討論,以及一些平行處理 (在 Spinlock 也只是稍微提及),最後是 network 功能,以及個人想加入的 socket 功能等等討論,本系列文將會在日後持續更新,也請各位讀者可以好好期待。
本系列文日後的目標,除上面所提及之外,也希望將恐龍書中的一些內容給整合進來,例如恐龍書中提及的 Interrupt Vector,System call 的流程,在恐龍書上只說明了大概得概念,而在 xv6 中我們可以看到一些實作得部分,希望本系列文可以之後加上恐龍書提及的概念,並以 xv6 作為舉例,來對整個概念有更加清晰地闡述。
最後希望能加入與實際 Linux kernel 的相關比較,可能會另外開一篇鐵人賽吧XD
這個系列文沒有一定的閱讀順序,而目前的順序是個人學習的經驗,首先是先對作業系統的概念,以及 xv6 有一定的了解,接著將 xv6 啟動,並使用其 API 先對整個概念有一個大致上的了解,在使用 API 過程,我們就會碰到一些 Process,I/O 設備,Pipeline,File Descriptor 的觀念,並在後面對這一些觀念進一步的說明。
在了解 Process 之前,需要先了解記憶體分頁的概念,才能夠對作業系統隔離性的實現有更進一步的了解 (如 User Space 與 Kernel Space 的 Address Space 的隔離,以及相對於 Physical Memory 的關係),以及對日後 Page Fault,sbrk()
等等概念的掌握也有一定的幫助。
說明完記憶體分頁後,接著回顧到先前我們在使用 xv6 提供的 API (也就是 System call 的概念),去了解其相關的重要議題,如 Interrupt,Trap 等操作,藉由追蹤 Trap 的過程,對 RISC-V 的 CSR 以及其相關操作,和作業系統的分層有更進一步的認識,並且在介紹 Trap 的同時,引入 Page Fault 的概念,以及我們可以運用 Page Fault 來達到一些操作,如 lazy allocation,並再次強調錯誤的處理是不被 User Sapce 中 Process 所感知的隔離性概念。
在 Interrupt 的介紹中,稍微提及了周圍 I/O 設備也會產生 Interrupt,以及在追蹤 Trap 的過程中,我們可以看到在 usertrap()
中,有一個對於周圍 I/O 設備的 Trap 處理,也就是所謂 Trap Handler 的概念,並藉此來引入 UART 的概念,以及看到 UART 與 File Descriptor 之間的關係,並在 UART 與 Console 中,簡介了生產與消費者的問題。
在最一開始 API 操作,使用到了 fork()
和 exec()
看到了兩個 Process 對同一個 Console 輸出所產生的問題,以及 UART 中看到了 lock 的使用,以此去簡介 xv6 中 lock 機制的實作,以及 Spinlock 的概念 (這邊還欠缺與 sleep()
, wakeup()
等比較,日後補上以完整內容),最後看到了 UART 是如何使用 Spinlock 的。
在有了 lock, 記憶體分頁等概念後,我們才來詳細的說明 Process,以及 xv6 啟動與架構中提及的 userinit()
,並在這裡引入的 State 的概念,包含 RUNNABLE, RUNNING 等等,並在介紹完 Process 之後,帶入 Thread 的相關概念,以及 Thread 和 Scheduler 在 xv6 的相關實作,這邊日後需要補上 multiprocess 和 multithread 之間概念的比較。
而在最後兩天,加入了 C 語言的 static, extern, volatile, inline, Pointer 等等概念,一方面是 xv6 中有出現這一些修飾字的使用,另一方面也是對自己觀念上的檢視與修正。到這裡本系列文就算是告了一個小段落了。
編輯部分使用 hackmd 進行編輯,圖的繪製使用 draw.io,時程規劃使用 notion 完成。
最後想提一下為什麼選擇這個題目參賽,選擇這個題目是因為覺得作業系統裡面涵蓋了電腦科學中許多的知識與應用,因此決定來進行學習。選 xv6 是因為 kernel 部分 10000 行以內,相對於 Linux kernel 比較有機會對整體有一個細部的掌握。
首先想要特別感謝 Jserv 教授,對我在作業系統的學習上提出了一些建議,並對系列文一些用字上做出修正,以及將資源開放在網路上供大家自由存取與學習,特別感謝。
感謝陳鍾誠教授,提供了一些 xv6 與 RISC-V 的學習資源與教材,對我在 RISC-V 的 Exception, Interrupt, Trap 的概念澄清上有很大的幫助。
感謝 那團名要叫什麼? 的團員們,感謝 zeze, Hank Yu, 飛飛 等大大們的鼓勵與方向的指引,感謝 EN, 高魁良 大大們的鐵人賽,讓我在觀念釐清大受益良多。
明天的鐵人賽,我們... ( 讓我考慮一下XD